import os
import openpyxl
import pandas as pd
from openpyxl import load_workbook


def extract_and_save_single_sheet(excel_source_path, output_folder_path):
    original_file_name = os.path.basename(excel_source_path)#文件名
    output_cleaned_file = os.path.join(output_folder_path, original_file_name)#文件路径+文件名
    sheet_names = pd.ExcelFile(excel_source_path).sheet_names#获得所有的工作簿名称但不加载数据

    print("\n该 Excel 文件中包含以下工作表：")
    print("=" * 60)
    for i, name in enumerate(sheet_names, 1):#打印工作簿名称方便选择
        print(f"{i}. {name}")
    print("=" * 60)

    choice = int(input("\n请输入你要读取的工作表编号（例如：1）："))
    selected_sheet_name = sheet_names[choice - 1]

    print(f"✅ 选择工作表：【{selected_sheet_name}】")
    df = pd.read_excel(excel_source_path, sheet_name=selected_sheet_name)#创建DataFrame对象
    print(f"✅ 已成功读取工作表【{selected_sheet_name}】的数据。")

    df.to_excel(output_cleaned_file, sheet_name=selected_sheet_name, index=False)#保存文件，不想要索引加（, index=False）

    print(f"✅ 已将工作表【{selected_sheet_name}】保存到：\n【{output_cleaned_file}】（覆盖保存）")
    return output_cleaned_file


def clean_cell_content(value):
    # 1. 如果是空值（如 None、NaN、pandas.NA），返回空字符串 ''
    if pd.isna(value):
        return ''

    # 2. 如果是数字类型（int、float），但 **不是日期数字（如 45000）**，原样返回
    if isinstance(value, (int, float)):
        # 🚨 假设日期数字在 40000~50000 之间（Excel 的日期序列号范围）
        if 40000 < value < 50000:  # 如果是 Excel 日期数字（如 45000）
            # 转回日期格式（如 2025-08-27）
            return pd.to_datetime(value, unit="D", origin="1899-12-30").strftime("%Y-%m-%d")
        else:
            return value  # 普通数字（如 123）原样返回

    # 3. 如果是字符串，清理特殊符号（\n、空格等）
    if isinstance(value, str):
        value_cleaned = value.replace('\n', '').replace('\r', '').replace(' ', '')
        return value_cleaned

    # 4. 其他情况（如布尔值、日期对象等），原样返回
    return value

def unmerge_all_cells(excel_file_path, output_file_path=None):

    wb = openpyxl.load_workbook(excel_file_path)

    # 如果未指定输出路径，则覆盖原文件
    if output_file_path is None:
        output_file_path = excel_file_path

    for sheet in wb.worksheets:#找到合并单元格的区域所在
        merged_ranges = list(sheet.merged_cells.ranges)  # 注意：sheet.merged_cells 是一个 MergedCellRanges 对象
        for merged_range in merged_ranges:#取消合并单元格
            sheet.unmerge_cells(str(merged_range))

    wb.save(output_file_path)
    print(f"\n【{output_file_path}】 文件中已取消所有合并单元格")


def delete_specific_rows_from_excel(excel_file_path, df=None):
    wb = openpyxl.load_workbook(excel_file_path)
    sheet = wb.active
    if df is not None:
        print("=" * 60)
        print(df.head(2))
        print("=" * 60)
    else:
        print("未提供 DataFrame，跳过数据预览。")
    print("\n1:删除第一、三行\n2:删除第二行")
    user_input = input("请输入数字 1 或 2：")

    if user_input == '1':
        print("你选择了删除第一、三行。")
        sheet.delete_rows(1)
        sheet.delete_rows(2)
    elif user_input == '2':
        print("你选择了删除第二行。")
        sheet.delete_rows(2)
    else:
        print("输入无效，默认不进行任何操作。")

    wb.save(excel_file_path)

    print(f"\n【{excel_file_path}】 文件删除标头")




def modify_excel_cells_by_search(
    output_cleaned_file,
    search_value='具体类别',
    new_value_main='具体类别一级枚举值',
    new_value_side='具体类别二级枚举值'
):

    try:
        workbook = load_workbook(filename=output_cleaned_file)
        found_cells = []
        for row in workbook.active.iter_rows():#查找“具体类别”的坐标位置
            for cell in row:
                if cell.value == search_value:
                    coord = cell.coordinate  # 如 "A2"
                    found_cells.append(coord)

        # 4. 处理查找结果
        if found_cells:
            print(f"✅ 找到内容 '{search_value}' 的单元格坐标有：{', '.join(found_cells)}")

            target_coord = found_cells[0]#查找到的坐标
            workbook.active[target_coord] = new_value_main#根据坐标修改值
            print(f"✅ 已将单元格 [{target_coord}] 的内容修改为：「{new_value_main}」")

            # 获取该单元格对象，并获取其右侧单元格（即 column + 1）
            cell = workbook.active[target_coord]
            right_cell = cell.offset(column=1)  # 右侧单元格的坐标
            right_coord = right_cell.coordinate
            workbook.active[right_coord] = new_value_side#根据坐标修改值
            print(f"✅ 已将单元格 [{right_coord}] 内容修改为：「{new_value_side}」")

            workbook.save(filename=output_cleaned_file)
            print(f"【{output_cleaned_file}】 文件已保存具体类别已修改")

            return True, found_cells
        else:
            print(f"❌ 未找到内容 '{search_value}'，无法进行修改。")
            return False, []
    except Exception as e:
        print(f"⚠️ 发生错误：{e}")
        return False, []